package org.stars.daostars.sqlmapper.loader.xml;

import org.stars.daostars.core.SqlQuery;
import org.stars.daostars.sqlmapper.SqlMapper;
import org.stars.util.StringUtility;

import org.xml.sax.Attributes;

public abstract class QueryTagHandler {
	private static final String MAP = "map";
	private static final String PRECONDITION = "precondition";
	private static final String ORDER = "order";
	private static final String BASE = "base";
	private static final String NAME = "name";
	
	/**
	 * Handler dell'inizio del tag query
	 * @param definition
	 * @param attributes
	 * @return
	 */
	public static SqlQuery startElement(SqlMapper definition, Attributes attributes)
	{
		String sBase;
		String sOrderBy;
		String sPrecondition;
		String sMapName;

		String currentSqlName = "";
		currentSqlName = StringUtility.nvl(attributes.getValue(NAME), "default").toUpperCase().trim();

		SqlQuery sqlQuery = new SqlQuery(currentSqlName, definition);

		sBase = StringUtility.nvl(attributes.getValue(BASE), "").toUpperCase().trim();
		sOrderBy = StringUtility.nvl(attributes.getValue(ORDER), "").toUpperCase().trim();
		sPrecondition = StringUtility.nvl(attributes.getValue(PRECONDITION), "").toUpperCase().trim();
		sMapName = StringUtility.nvl(attributes.getValue(MAP), "").toUpperCase().trim();

		sqlQuery.setBaseSqlQueryName(sBase);
		sqlQuery.setOrderByName(sOrderBy);
		sqlQuery.setPrecondition(sPrecondition);
		sqlQuery.setConversionMapName(sMapName);

		definition.setQuery(currentSqlName, sqlQuery);

		return sqlQuery;
	}
	
	/**
	 * Sostituisce gli spazi doppi, i tab e gli invii a capo con spazio.
	 * 
	 * A parte questo, non è conveniente aggiungere con trim gli spazi prima e dopo,
	 * dato che potrebbe modificare la costruzione della query.
	 * 
	 * @param sApp
	 * @return
	 */
	public static String characters(String sApp)
	{
		// rimuoviamo gli spazi doppi
		sApp = sApp.replace('\t', ' ');
		sApp = sApp.replace('\n', ' ');		
		sApp = StringUtility.replace(sApp, "  ", " ");
		
		return sApp;
	}
	
	public static void endElement(SqlQuery currentQuery, StringBuilder buffer)
	{	
		// impostiamo la query.
		currentQuery.setPlainSql(buffer.toString()); 
	}
}
